﻿using ConfExpert.Datasets;
using ConfExpert.Forms.Base;
using ConfExpert.Properties;
using DevExpress.XtraBars;
using DevExpress.XtraEditors;
using DevExpress.XtraEditors.Controls;
using DevExpress.XtraEditors.Repository;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraGrid.Views.Base;
using DevExpress.XtraGrid.Views.Grid;
using DevTeam;
using System;
using System.Data;
using System.Windows.Forms;

namespace ConfExpert.Forms.Depo
{
    public partial class Sepet : XForm
    {
        DataTable dtToplarinMusterileri;
        public Sepet()
        {
            InitializeComponent();
        }

        BindingSource bsSepet, bsSepetLines;
        string sepetLinesQtyExpression = "Iif(ISNULL(QtySelected,0)=0, Qty, ISNULL(QtySelected,0))";

        public MyData.xSepetLinesDataTable SelectedRolls
        {
            get
            {
                MyData.xSepetLinesDataTable dtSepetLines = new MyData.xSepetLinesDataTable();
                foreach (var item in ds.xSepetLines.Select("Seç=1", string.Empty))
                    dtSepetLines.ImportRow(item);

                return dtSepetLines;
            }
        }

        public MyData.xSepetDataTable SelectedArts
        {
            get
            {
                MyData.xSepetDataTable dtSepet = new MyData.xSepetDataTable();
                foreach (var item in ds.xSepet.Select("Qty>0", string.Empty))
                    dtSepet.ImportRow(item);

                return dtSepet;
            }
        }

        bool KDept = false;
        private void Sepet_Load(object sender, EventArgs e)
        {
            //btnAtilDepoyaAt.Visibility = AmI(17) ? BarItemVisibility.Always : BarItemVisibility.Never;
            KDept = ytk(133);

            GetDetails("xSepet;xSepetLines", "GetSepet2", WhoAmI);

            ds.xSepetLines.Columns.Add("SelectedQty", typeof(decimal), sepetLinesQtyExpression);
            ds.xSepetLines.Columns.Add("Seç", typeof(bool));
            ds.xSepetLines.Columns.Add("KaliteKontrol", typeof(int), "Iif(ISNULL(KaliteKontrolId,0) in (2,3,4,5,7), 1, 0)");

            ds.xSepet.Columns.Add("Qty", typeof(decimal), "SUM(Child(FK_xSepetLines_xSepet_ProductId).SelectedQty)");
            ds.xSepet.Columns.Add("Karbelde", typeof(string), "MAX(Child(FK_xSepetLines_xSepet_ProductId).Karbelde)");
            ds.xSepet.Columns.Add("TopAdedi", typeof(int), "COUNT(Child(FK_xSepetLines_xSepet_ProductId).RollId)");

            //string foreignKey = "FK_xSepetLines_xSepet_ProductId";
            //string expression = string.Format("iif(count(Child({0}).Seç = 1 )>1,10,0)", foreignKey);
            //string expression = string.Format("sum(Child.Seç)", foreignKey);


            bsSepet = new BindingSource(ds, "xSepet");
            bsSepetLines = new BindingSource(bsSepet, "FK_xSepetLines_xSepet_ProductId");
            AddBsToList(bsSepet, bsSepetLines);

            InitGridView(gvArtikel, bsSepet);
            InitGridView(gvTop, bsSepetLines);

            ((RepositoryItemGridLookUpEdit)gvArtikel.Columns["MuadilTipId"].ColumnEdit).TextEditStyle = TextEditStyles.DisableTextEditor;
            gvArtikel.SetCaptions("Qty:Toplam", "AlternatifId:Neyin Muadili?", "MuadilTipId:Muadil Tipi", "Aciklama:İrs. Açıklama");
            gvTop.SetCaptions("OrderRef:Order Ref.", "Qty:Top Metrajı", "QtySelected:İstenen Metraj", "RollId:Top Id");
            gvTop.FormatAsNumber(1, "Qty", "QtySelected", "En");
            gvTop.AddSummary("Qty", "QtySelected");

            gvTop.MakeColumnInvisible("SelectedQty", "Scan", "ProductId", "SepetLinesId", "KaliteKontrol");
            gvTop.Columns["Seç"].VisibleIndex = 0;
            gvTop.Columns["En"].VisibleIndex = gvTop.Columns["UreticiKodu"].VisibleIndex + 1;
            gvTop.MakeReadOnly("Seç", "QtySelected");
            //gvTop.ShowingEditor += new System.ComponentModel.CancelEventHandler(gvTop_ShowingEditor);


            emptyEditor = new RepositoryItemButtonEdit();
            emptyEditor.Buttons.Clear();
            emptyEditor.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.HideTextEditor;
            gcArtikel.RepositoryItems.Add(emptyEditor);


            gvArtikel.MakeColumnInvisible("ProductId");
            gvArtikel.Columns["Qty"].VisibleIndex = gvArtikel.Columns["TelaId"].VisibleIndex + 1;
            gvArtikel.MakeReadOnly("AlternatifId", "Aciklama", "MuadilTipId");

            gvTop.ValidateRow += new DevExpress.XtraGrid.Views.Base.ValidateRowEventHandler(gvTop_ValidateRow);

            gvTop.RowCellClick += new RowCellClickEventHandler(gvTop_RowCellClick);
            gvTop.InvalidRowException += new DevExpress.XtraGrid.Views.Base.InvalidRowExceptionEventHandler(gvTop_InvalidRowException);

            gvArtikel.InvalidRowException += gvArtikel_InvalidRowException;
            gvArtikel.ValidateRow += gvArtikel_ValidateRow;
            gvArtikel.CellValueChanged += gvArtikel_CellValueChanged;

            GridManager gm;
            gm = GridManager.GetManager(gvTop);
            gm.GridMenu.AddMenu("Seç", TopuSec, Resources.Plus_16x16);
            gm.GridMenu.AddMenu("Bırak", TopuBirak, Resources.Minus_16x16);
            gm.GridMenu.AddMenu("Sepetten çıkar", TopuSepettenCikar, Resources.Cross_16x16);

            gm = GridManager.GetManager(gvArtikel);
            gm.GridMenu.AddMenu("Seçili artikellerin toplarını seç", ArtikeliSec, Resources.Plus_16x16);
            gm.GridMenu.AddMenu("Seçili artikellerin toplarını bırak", ArtikeliBirak, Resources.Minus_16x16);

            //gm.GridMenu.AddMenu("Seçili artikellerden parça çıkışı iste", ParcaCikisi, Resources.Plus_16x16);

            btnAyir.ItemClick += btnAyir_ItemClick;
            btnCikisEmri.ItemClick += btnCikisEmri_ItemClick;
            btnParcaCikisi.ItemClick += btnParcaCikisi_ItemClick;
            btnSatis.ItemClick += btnSatis_ItemClick;
            btnSepetiBosalt.ItemClick += btnSepetiBosalt_ItemClick;
            btnGuncelle.ItemClick += btnGuncelle_ItemClick;
            btnAtilDepoyaAt.ItemClick += Atil_ItemClick;

            //btnSatis.Visibility = (isKD || isAdmin) ? BarItemVisibility.Always : BarItemVisibility.Never;
            //TEST AMACLI
            //btnSatis.Visibility = BarItemVisibility.Always;

            gvArtikel.FormatAsNumber(1, "Qty");
            gvArtikel.AddSummary("Qty");
            gvArtikel.AddSummary("TopAdedi");
            gvArtikel.BestFitColumns();
            gvTop.BestFitColumns();

            btnAyir.CausesValidation = true;
            btnCikisEmri.CausesValidation = true;

            gvArtikel.SetViewCaption("Artikeller");
            gvTop.SetViewCaption("Seçili Artikelin Topları");
        }

        void btnSatis_ItemClick(object sender, ItemClickEventArgs e)
        {
            bsSepet.EndEdit();
            bsSepetLines.EndEdit();

            if (SelectedRolls.Count == 0)
            {
                ShowInfoMessage("Lütfen top seçiniz.");
                return;
            }

            string CommaSeparatedRollIdList = "0";
            foreach (DataRow dr in SelectedRolls.Rows)
                CommaSeparatedRollIdList += "," + dr["RollId"].ToStr();

            DataSet s = ExecuteDataSet("GetSatisKontrol", CommaSeparatedRollIdList, WhoAmI);
            dtToplarinMusterileri = s.Tables[0];
            DataTable dtYetkiminOlduguMusteriler = s.Tables[1];
            DataTable dtOwnerIdKarbel = s.Tables[2];

            if (dtToplarinMusterileri.Rows.Count == 0)
            {
                XtraMessageBox.Show("Uygun Kayıtlar Getirilemedi. Depodan Topların Çıkışının Yapılmadığına Emin Olun!", "Uyarı"); // Butun toplar icin ShelfId = 1 demek (buyuk ihtimalle)
                return;
            }

            if (!MusterilereYetkiliMi(dtToplarinMusterileri, dtYetkiminOlduguMusteriler))
            {
                XtraMessageBox.Show("Yetkili Olmadığınız Depo(lar)dan Top Seçtiniz!", "Uyarı");
                return;
            }

            if (dtToplarinMusterileri.Rows.Count > 1)
            {
                XtraMessageBox.Show("Seçtiğiniz Topların Farklı Müşteri Depolarında Olmaması Gerekir!", "Uyarı");
                return;
            }

            if (dtToplarinMusterileri.Rows[0]["CustomerId"].ToInt() == 1)
            {
                XtraMessageBox.Show("Bu işlem Karbel depodaki toplar üzerinde gerçekleştirilemez!", "Uyarı");
                return;
            }

            if (dtOwnerIdKarbel.Rows.Count != 0 && dtOwnerIdKarbel.Rows[0]["OwnerId"].ToInt() == 1)
            {
                using (DepoIciSatis dis = new DepoIciSatis(CommaSeparatedRollIdList, dtToplarinMusterileri.Rows[0]["CustomerId"].ToInt(), dtToplarinMusterileri.Rows[0]["Name"].ToStr()))
                {
                    if (dis.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                        Notify("Topların Mal Sahibini Değiştirme İşlemi Başarıyla Gerçekleşti.");
                }

            }
            else
            {
                XtraMessageBox.Show("Seçtiğiniz Toplardan En Az Birinin Mal Sahibi Karbel Olmalıdır!", "Uyarı");
                return;
            }
        }

        RepositoryItemButtonEdit emptyEditor;

        void btnParcaCikisi_ItemClick(object sender, ItemClickEventArgs e)
        {
            bsSepet.EndEdit();
            bsSepetLines.EndEdit();
            gvTop.EndEditing();

            if (SelectedRolls.Count == 0)
            {
                ShowInfoMessage("Lütfen artikel veya top seçiniz.");
                return;
            }

            if (ds.xSepetLines.Select("Seç=1 AND Karbelde='E'").Length > 0)
            {
                ShowInfoMessage("DU4/Destex rafındaki toplar bir parça çıkışında geçemez. Parça Çıkış emri oluşturmak için bunları hariç tutmalısınız.");
                return;
            }

            if (ds.xSepetLines.Select("Seç=1 AND QtySelected<>Qty").Length > 0)
                XtraMessageBox.Show("Bazı toplar için istenen metrajı değiştirdiniz. Bu alan, çıkış emirlerindeki bölünecek toplar için düşünülmüş olup parça çıkışlarında kullanılmamaktadır. İstediğiniz metrajı birazdan açılacak olan formda girmelisiniz.", "ÖNEMLİ UYARI");

            Kaydet();
            using (ParcaCikisEmri cikis = new ParcaCikisEmri(SelectedRolls, SelectedArts, KDept))
            {
                if (cikis.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    Session.InvalidateStoklar = true;
                    Guncelle();
                }
            }
        }

        void gvTop_ShowingEditor(object sender, System.ComponentModel.CancelEventArgs e)
        {
            e.Cancel = !(gvTop.FocusedColumn.FieldName == "Seç" ||
                gvTop.FocusedColumn.FieldName == "QtySelected" && gvTop.GetFocusedRowCellDisplayText("Karbelde") != string.Empty);
        }

        void gvTop_RowCellClick(object sender, RowCellClickEventArgs e)
        {
            if (e.Column.FieldName == "Seç")
            {
                bool currentStatus = false;
                if (e.CellValue != DBNull.Value)
                {
                    currentStatus = (bool)e.CellValue;
                }
                gvTop.SetRowCellValue(e.RowHandle, e.Column, !currentStatus);
            }

        }

        private void testUpdateCalculations()
        {
            DataView currentRolls = (DataView)((System.Windows.Forms.BindingSource)(gvTop.DataSource)).List;
            gvArtikel.SetRowCellValue(gvArtikel.FocusedRowHandle, "Seçilen Top Adedi", currentRolls.ToTable().Select("Seç=1").Length);
        }

        private void Guncelle()
        {
            gvArtikel.EndEditing();
            gvTop.EndEditing();
            ds.Clear();
            GetDetails("xSepet;xSepetLines", "GetSepet2", WhoAmI);
            gvArtikel.BestFitColumns();
            gvTop.BestFitColumns();
        }

        void btnGuncelle_ItemClick(object sender, ItemClickEventArgs e)
        {
            Kaydet();
            Guncelle();
        }

        void btnSepetiBosalt_ItemClick(object sender, ItemClickEventArgs e)
        {
            if (XtraMessageBox.Show("Sepeti boşaltmak istediğinizden emin misiniz?", "Uyarı", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
            {
                ExecuteNonQuery("SepetiBosalt", WhoAmI);
                Session.InvalidateStoklar = true;
                Guncelle();
            }
        }

        void btnCikisEmri_ItemClick(object sender, ItemClickEventArgs e)
        {
            bsSepet.EndEdit();
            bsSepetLines.EndEdit();

            if (SelectedRolls.Count == 0)
            {
                ShowInfoMessage("Lütfen çıkmak istediğiniz topları seçiniz.");
                return;
            }

            if (ds.xSepetLines.Select("Seç=1 AND Karbelde='E'").Length > 0)
            {
                ShowInfoMessage("DU4/Destex rafındaki toplar bir çıkış emrinde geçemez. Çıkış emri oluşturmak için bunları hariç tutmalısınız.");
                return;
            }

            if (ds.xSepetLines.Select("Seç=1 AND QtySelected>qty").Length > 0)
            {
                ShowInfoMessage("İstenen metraj topun metrajından büyük olamaz.");
                return;
            }

            if (IsKaliteKontolOk())
            {
                Kaydet();
                using (Cikis.CikisEmri cikis = new Cikis.CikisEmri(SelectedRolls, SelectedArts, KDept))
                {
                    if (cikis.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        Session.InvalidateStoklar = true;
                        Guncelle();
                    }
                }
            }
        }

        private bool IsKaliteKontolOk()
        {
            //Seçilen fireli toplar
            bool Result = true;
            string Message = "";

            DataRow[] drKaliteKontrol = ds.xSepetLines.Select("Seç=1 and KaliteKontrol = 1");
            if (drKaliteKontrol.Length > 0)
            {
                Message += "DİKKAT!!! Fireli topları seçtiniz :\n";
                foreach (DataRow drKalite in drKaliteKontrol)
                {
                    int ProductId = drKalite["ProductId"].ToInt();
                    int KaliteKontrolId = drKalite["KaliteKontrolId"].ToInt();
                    string RollId = drKalite["RollId"].ToStr();
                    string KumasKodu = ConfExpert.Utility.AppSession.Lookups.V_Kumas.FindByProductId(ProductId).Name;
                    string KaliteKontrol = ConfExpert.Utility.AppSession.Lookups.KaliteKontrol.FindByKaliteKontrolId(KaliteKontrolId).Name;

                    Message += KumasKodu + " - " + RollId + " - " + KaliteKontrol + "\n";
                }

                if (XtraMessageBox.Show(Message + "\n\nİşleme devam etmek istiyor musunuz ?", "Özet", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.No)
                    Result = false;

            }
            return Result;
        }

        void btnAyir_ItemClick(object sender, ItemClickEventArgs e)
        {
            bsSepet.EndEdit();
            bsSepetLines.EndEdit();

            if (SelectedRolls.Count == 0)
            {
                ShowInfoMessage("Lütfen ayırmak istediğiniz topları seçiniz.");
                return;
            }

            if (ds.xSepetLines.Select("Seç=1 AND Karbelde='E'").Length > 0 && !ytk(134))
            {
                ShowInfoMessage("DU4/Destex rafındaki topları ayıramazsınız.");
                return;
            }

            if (IsKaliteKontolOk())
            {
                Kaydet();
                using (Transfer transfer = new Transfer(SelectedRolls, SelectedArts, KDept))
                {
                    if (transfer.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        Session.InvalidateStoklar = true;
                        Guncelle();
                    }
                }
            }
        }

        void btnKaydet_ItemClick(object sender, ItemClickEventArgs e)
        {
            Kaydet();
            ShowInfoMessage("Sepetiniz başarıyla kaydedildi.");
        }

        private void Kaydet()
        {
            gvArtikel.EndEditing();
            gvTop.EndEditing();

            ds.xSepetLines.Columns["SelectedQty"].Expression = null;
            ExecuteNonQuery("UpdSepet1", WhoAmI, ds.xSepetLines.Serialize());
            ds.xSepetLines.Columns["SelectedQty"].Expression = sepetLinesQtyExpression;
        }

        private void Atil_ItemClick(object sender, ItemClickEventArgs e)
        {
            bsSepet.EndEdit();
            bsSepetLines.EndEdit();

            if (SelectedRolls.Count == 0)
            {
                ShowInfoMessage("Lütfen atıl olarak işaretlemek istediğiniz topları seçiniz.");
                return;
            }

            string str = string.Empty;
            DataTable dt = ExecuteDataTable("CheckAtilToplar", SelectedRolls.Serialize(), WhoAmI);
            foreach (DataRow r in dt.Rows)
                str += Environment.NewLine + r["RollId"].ToStr();

            if (str != string.Empty)
            {
                XtraMessageBox.Show("Yetkili olmadığınız depodaki bir topu atıla atamazsınız. Bu kuralı ihlal eden toplar: " + Environment.NewLine + str, "Hata");
                return;
            }

            switch (ExecuteScalar("CheckAtilDepoyaAt_R", RollIds).ToInt())
            {
                case 2:
                    using (AtilDepoyaAt a = new AtilDepoyaAt(SelectedRolls))
                        if (a.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                        {
                            Session.InvalidateStoklar = true;
                            Guncelle();
                        }
                    break;

                case 1:
                    XtraMessageBox.Show("Atıl toplar yeniden atıl olarak işaretlenemez. Böyle toplar listeden çıkarıldı.");
                    using (AtilDepoyaAt a = new AtilDepoyaAt(SelectedRolls))
                        if (a.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                        {
                            Session.InvalidateStoklar = true;
                            Guncelle();
                        }
                    break;

                default:
                    XtraMessageBox.Show("Seçilen topların tümü zaten atıl olarak işaretli!");
                    break;
            }
        }

        void ArtikeliSec(object sender, EventArgs e)
        {
            foreach (int handle in gvArtikel.GetSelectedRows())
            {
                int ProductId = intParse(gvArtikel.GetRowCellValue(handle, "ProductId"));
                foreach (MyData.xSepetLinesRow r in ds.xSepetLines.Select("ProductId = " + ProductId.ToString()))
                    r["Seç"] = true;
            }
        }

        void ArtikeliBirak(object sender, EventArgs e)
        {
            foreach (int handle in gvArtikel.GetSelectedRows())
            {
                int ProductId = intParse(gvArtikel.GetRowCellValue(handle, "ProductId"));
                foreach (MyData.xSepetLinesRow r in ds.xSepetLines.Select("ProductId = " + ProductId.ToString()))
                    r["Seç"] = false;
            }
        }

        void TopuSec(object sender, EventArgs e)
        {
            foreach (int handle in gvTop.GetSelectedRows())
                gvTop.SetRowCellValue(handle, "Seç", true);
        }

        void TopuBirak(object sender, EventArgs e)
        {
            foreach (int handle in gvTop.GetSelectedRows())
                gvTop.SetRowCellValue(handle, "Seç", false);
        }

        void TopuSepettenCikar(object sender, EventArgs e)
        {
            DataTable dt = new DataTable("Table");
            dt.Columns.Add("RollId", typeof(int));

            foreach (int handle in gvTop.GetSelectedRows())
                dt.Rows.Add(intParse(gvTop.GetRowCellValue(handle, "RollId")));

            ds.xSepetLines.Clear();
            ds.xSepet.Clear();

            GetDetails("xSepet;xSepetLines", "RemoveRollsFromSepet", WhoAmI, dt.SerializeChanges());
            Session.InvalidateStoklar = true;
        }

        void gvTop_ValidateRow(object sender, DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e)
        {
            decimal qtySelected = decimalParse(gvTop.GetRowCellValue(e.RowHandle, "QtySelected"));
            decimal qty = decimalParse(gvTop.GetRowCellValue(e.RowHandle, "Qty"));

            if (qtySelected > qty)
            {
                e.Valid = false;
                gvTop.SetColumnError(gvTop.Columns["QtySelected"], "Girilen değer, topun metrajından büyük olmamalı.");
                btnAyir.Enabled = btnCikisEmri.Enabled = false;
                ShowErrorMessage("Girdiğiniz metraj, topun metrajından fazla olmamalı !");
            }
            else
            {
                btnAyir.Enabled = btnCikisEmri.Enabled = true;
            }
            //gvTop.SetRowCellValue(e.RowHandle, "Seç", true);
        }

        void gvTop_InvalidRowException(object sender, DevExpress.XtraGrid.Views.Base.InvalidRowExceptionEventArgs e)
        {
            //Suppress displaying the error message box
            e.ExceptionMode = ExceptionMode.NoAction;
        }

        private void gvArtikel_ValidateRow(object sender, DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e)
        {
            GridColumn c1 = gvArtikel.Columns["MuadilTipId"];
            GridColumn c2 = gvArtikel.Columns["AlternatifId"];

            int MuadilTipId = gvArtikel.GetRowCellValue(e.RowHandle, c1).ToInt(-1);
            int AlternatifId = gvArtikel.GetRowCellValue(e.RowHandle, c2).ToInt(-1);

            if (MuadilTipId * AlternatifId < 0)
            {
                e.Valid = false;
                string error = @"""Muadil Tipi"" ve ""Neyin Muadili?"" sütunları beraber doldurulmalı veya ikisi de boş bırakılmalı.";
                gvArtikel.SetColumnError(c1, error);
                gvArtikel.SetColumnError(c2, error);
            }
        }


        private void gvArtikel_InvalidRowException(object sender, DevExpress.XtraGrid.Views.Base.InvalidRowExceptionEventArgs e)
        {
            e.ExceptionMode = ExceptionMode.NoAction;
        }

        void gvArtikel_CellValueChanged(object sender, CellValueChangedEventArgs e)
        {
            if (e.Value == DBNull.Value)
            {
                gvArtikel.CellValueChanged -= gvArtikel_CellValueChanged;

                if (e.Column.FieldName == "MuadilTipId")
                    gvArtikel.SetRowCellValue(e.RowHandle, "AlternatifId", DBNull.Value);
                else if (e.Column.FieldName == "AlternatifId")
                    gvArtikel.SetRowCellValue(e.RowHandle, "MuadilTipId", DBNull.Value);

                gvArtikel.CellValueChanged += gvArtikel_CellValueChanged;
            }
        }

        private bool MusterilereYetkiliMi(DataTable dt1, DataTable dt2)
        {
            bool Yetkili = false;
            int Count = 0;

            for (int i = 0; i < dt1.Rows.Count; ++i)
                for (int j = 0; j < dt2.Rows.Count; ++j)
                    if (dt1.Rows[i]["CustomerId"].ToStr().Equals(dt2.Rows[j]["CustomerId"].ToStr()))
                        Count++;

            if (Count == dt1.Rows.Count)
                Yetkili = true;

            return Yetkili;
        }

        public object RollIds { get; set; }
    }
}